home *** CD-ROM | disk | FTP | other *** search
/ SPACE 2 / SPACE - Library 2 - Volume 1.iso / games / 111 / signal.c < prev    next >
C/C++ Source or Header  |  1987-02-19  |  5KB  |  178 lines

  1. #ifndef TOS
  2. #include <signal.h>
  3. #endif
  4. #include "header.h"            /* "Larn is copyrighted 1986 by Noah Morgan.\n" */
  5. #define BIT(a) (1<<((a)-1))
  6. extern char savefilename[],wizard,predostuff,nosignal;
  7. static s2choose()    /* text to be displayed if ^C during intro screen */
  8.     {
  9.     cursor(1,24); lprcat("Press "); setbold(); lprcat("return"); resetbold();
  10.     lprcat(" to continue: ");   lflush(); 
  11.     }
  12.  
  13. #ifndef TOS
  14. static
  15. #endif
  16.     cntlc()    /* what to do for a ^C */
  17.     {
  18.     if (nosignal) return;    /* don't do anything if inhibited */
  19. #ifndef TOS
  20.     signal(SIGQUIT,SIG_IGN);    signal(SIGINT,SIG_IGN);
  21. #endif
  22.     quit(); if (predostuff==1) s2choose(); else showplayer();
  23.     lflush();
  24. #ifndef TOS
  25.     signal(SIGQUIT,cntlc);    signal(SIGINT,cntlc);
  26. #endif
  27.     }
  28.  
  29. /*
  30.  *    subroutine to save the game if a hangup signal
  31.  */
  32. static sgam()
  33.     {
  34.     savegame(savefilename);  wizard=1;  died(-257); /* hangup signal */
  35.     }
  36.  
  37. #ifdef SIGTSTP
  38. static tstop() /* control Y    */
  39.     {
  40.     if (nosignal)   return;  /* nothing if inhibited */
  41.     lcreat((char*)0);  clearvt100();    lflush();      signal(SIGTSTP,SIG_DFL);
  42. #ifdef SIGVTALRM
  43.     /* looks like BSD4.2 or higher - must clr mask for signal to take effect*/
  44.     sigsetmask(sigblock(0)& ~BIT(SIGTSTP));
  45. #endif
  46.     kill(getpid(),SIGTSTP);
  47.  
  48.     setupvt100();  signal(SIGTSTP,tstop);
  49.     if (predostuff==1) s2choose(); else drawscreen();
  50.     showplayer();    lflush();
  51.     }
  52. #endif SIGTSTP
  53.  
  54. #ifdef TOS
  55. #define NSIG    20
  56. #define SIGHUP    1
  57. #define SIGINT  2
  58. #define SIGQUIT 3
  59. #define SIGILL  4
  60. #define SIGTRAP 5
  61. #define SIGIOT  6
  62. #define SIGEMT  7
  63. #define SIGFPE  8
  64. #define SIGKILL 9
  65. #define SIGBUS  10
  66. #define SIGSEGV 11
  67. #define SIGSYS  12
  68. #define SIGPIPE 13
  69. #define SIGALRM 14
  70. #define SIGTERM 15
  71. #define SIGUSR1 16
  72. #define SIGUSR2 17
  73. #define SIGCLD  18
  74. #define SIGPWR  19
  75. #endif
  76. /*
  77.  *    subroutine to issue the needed signal traps  called from main()
  78.  */
  79. static sigill()  { sigpanic(SIGILL); }     static sigtrap() { sigpanic(SIGTRAP); }
  80. static sigiot()  { sigpanic(SIGIOT); }   static sigemt()  { sigpanic(SIGEMT); }
  81. static sigfpe()  { sigpanic(SIGFPE); }   static sigbus()  { sigpanic(SIGBUS); }
  82. static sigsegv() { sigpanic(SIGSEGV); }  static sigsys()  { sigpanic(SIGSYS); }
  83. static sigpipe() { sigpanic(SIGPIPE); }  static sigterm() { sigpanic(SIGTERM); }
  84. sigsetup()
  85.     {
  86. #ifndef TOS
  87.     signal(SIGQUIT, cntlc);         signal(SIGINT,  cntlc); 
  88.     signal(SIGKILL, SIG_IGN);        signal(SIGHUP,  sgam);
  89.     signal(SIGILL,  sigill);        signal(SIGTRAP, sigtrap);
  90.     signal(SIGIOT,  sigiot);        signal(SIGEMT,  sigemt);
  91.     signal(SIGFPE,  sigfpe);        signal(SIGBUS,  sigbus);
  92.     signal(SIGSEGV, sigsegv);        signal(SIGSYS,  sigsys);
  93.     signal(SIGPIPE, sigpipe);        signal(SIGTERM, sigterm);
  94. #ifdef SIGTSTP
  95.     signal(SIGTSTP,tstop);        signal(SIGSTOP,tstop);
  96. #endif SIGTSTP
  97. #endif TOS
  98.     }
  99.  
  100. #ifdef BSD    /* for BSD UNIX? */
  101.  
  102. static char *signame[NSIG] = { "",
  103. "SIGHUP",  /*    1     hangup */
  104. "SIGINT",  /*    2     interrupt */
  105. "SIGQUIT", /*    3     quit */
  106. "SIGILL",  /*    4     illegal instruction (not reset when caught) */
  107. "SIGTRAP", /*    5     trace trap (not reset when caught) */
  108. "SIGIOT",  /*    6     IOT instruction */
  109. "SIGEMT",  /*    7     EMT instruction */
  110. "SIGFPE",  /*    8     floating point exception */
  111. "SIGKILL", /*    9     kill (cannot be caught or ignored) */
  112. "SIGBUS",  /*    10     bus error */
  113. "SIGSEGV", /*    11     segmentation violation */
  114. "SIGSYS",  /*    12     bad argument to system call */
  115. "SIGPIPE", /*    13     write on a pipe with no one to read it */
  116. "SIGALRM", /*    14     alarm clock */
  117. "SIGTERM", /*    15     software termination signal from kill */
  118. "SIGURG",  /*    16     urgent condition on IO channel */
  119. "SIGSTOP", /*    17     sendable stop signal not from tty */
  120. "SIGTSTP", /*    18     stop signal from tty */
  121. "SIGCONT", /*    19     continue a stopped process */
  122. "SIGCHLD", /*    20     to parent on child stop or exit */
  123. "SIGTTIN", /*    21     to readers pgrp upon background tty read */
  124. "SIGTTOU", /*    22     like TTIN for output if (tp->t_local<OSTOP) */
  125. "SIGIO",   /*    23     input/output possible signal */
  126. "SIGXCPU", /*    24     exceeded CPU time limit */
  127. "SIGXFSZ", /*    25     exceeded file size limit */
  128. "SIGVTALRM",/*  26     virtual time alarm */
  129. "SIGPROF", /*    27     profiling time alarm */
  130. "","","","" };
  131.  
  132. #else BSD    /* for system V? */
  133.  
  134. static char *signame[NSIG] = { "",
  135. "SIGHUP",  /*    1     hangup */
  136. "SIGINT",  /*    2     interrupt */
  137. "SIGQUIT", /*    3     quit */
  138. "SIGILL",  /*    4     illegal instruction (not reset when caught) */
  139. "SIGTRAP", /*    5     trace trap (not reset when caught) */
  140. "SIGIOT",  /*    6     IOT instruction */
  141. "SIGEMT",  /*    7     EMT instruction */
  142. "SIGFPE",  /*    8     floating point exception */
  143. "SIGKILL", /*    9     kill (cannot be caught or ignored) */
  144. "SIGBUS",  /*    10     bus error */
  145. "SIGSEGV", /*    11     segmentation violation */
  146. "SIGSYS",  /*    12     bad argument to system call */
  147. "SIGPIPE", /*    13     write on a pipe with no one to read it */
  148. "SIGALRM", /*    14     alarm clock */
  149. "SIGTERM", /*    15     software termination signal from kill */
  150. "SIGUSR1",  /*    16     user defines signal 1 */
  151. "SIGUSR2", /*    17     user defines signal 2 */
  152. "SIGCLD",  /*    18     child death */
  153. "SIGPWR",  /*    19     power fail */
  154. };
  155.  
  156. #endif BSD
  157.  
  158. /*
  159.  *    routine to process a fatal error signal
  160.  */
  161. static sigpanic(sig)
  162.     int sig;
  163.     {
  164.     char buf[128];
  165. #ifndef TOS
  166.     signal(sig,SIG_DFL);
  167. #endif
  168.     sprintf(buf,"\nLarn - Panic! Signal %d received [%s]",sig,signame[sig]);
  169.     write(2,buf,strlen(buf));  sleep(2);
  170.     sncbr();
  171.     savegame(savefilename); 
  172. #ifdef TOS
  173.     exit(-1);
  174. #else
  175.     kill(getpid(),sig); /* this will terminate us */
  176. #endif
  177.     }
  178.